package com.ai.zhly.task;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;
import com.ai.dmc.index.common.InitParam;
import com.ai.dmc.index.common.bean.AreaBean;
import com.ai.dmc.index.common.cache.AreaCache;
import com.ai.dmc.index.common.cache.DataTimeCache;	
import com.ai.dmc.index.common.cache.HotMapCache;
import com.ai.dmc.index.common.util.DateUtil;
import com.ai.zhly.service.IHotMapUtilService;

import net.sf.json.JSONObject;

/**
 * @Description : 热力图任务
 * 
 * @author : wucm
 * @date : 2015年7月22日 下午2:51:05
 * @version V1.0
 * 
 */
@SuppressWarnings({ "unchecked", "rawtypes" })
public class HotMapTask {
	private static Logger logger = Logger.getLogger(HotMapTask.class);
	private String tableName = "st_moni_norm_chart_region_min";
	private static boolean executeFlagNow = false;// 防止多次执行

	private IHotMapUtilService hotMapUtil;
	
	public void setHotMapUtil(IHotMapUtilService hotMapUtil) {
		this.hotMapUtil = hotMapUtil;
	}

	public void execute(){
		if (!InitParam.HOT_CACHE) {
			return;
		}

		if (executeFlagNow) {
			return;
		}

		// 检查数据是否有更新
		if (!checkTime()) {
			return;
		}

		executeFlagNow = true;

		logger.debug("实时热力图任务开始时间："
				+ DateUtil.getInstance().getToday("yyyy-MM-dd hh:mm:ss"));
		try {
			loadHotMapCache();
		} catch (Exception e) {
			logger.error("实时热力图任务执行出错了，错误信息为" + e.toString());
		}
		logger.debug("实时热力图任务结束时间："
				+ DateUtil.getInstance().getToday("yyyy-MM-dd hh:mm:ss"));
		executeFlagNow = false;
	}

	/**
	 * 
	 * @Description : 检查数据是否有更新
	 * 
	 * @return boolean
	 * 
	 * @author : wucm
	 * @date : 2015年11月24日 下午7:05:10
	 * 
	 */
	private boolean checkTime() {
		boolean flag = true;

		String curTime = (String) DataTimeCache.dataTimeCache.get(tableName);

		String preTime = (String) HotMapCache.hotMapCache
				.get(HotMapCache.CACHE_NOW_TIME);

		if (null != curTime && null != preTime
				&& curTime.compareTo(preTime) <= 0) {
			flag = false;
		}

		return flag;
	}

	/**
	 * 
	 * @Description : 生成热力图数据
	 * @return void
	 * 
	 * @author : wucm
	 * @date : 2015年7月22日 下午3:14:29
	 * 
	 */
	public void loadHotMapCache() {
		// 判断是否存在
		if (null == HotMapCache.hotMapCache.get("now")) {
			Map nowMap = new HashMap();
			HotMapCache.hotMapCache.put("now", nowMap);
		}

		Map<String, AreaBean> rMap = AreaCache.areaCache
				.get(AreaBean.TYPE_REGION);
		Map<String, AreaBean> cMap = AreaCache.areaCache
				.get(AreaBean.TYPE_CITY);

		if (null == rMap && null == cMap) {
			return;
		}

		if (rMap.isEmpty() && cMap.isEmpty()) {
			return;
		}
		// 区域
		if (null != rMap) {
			for (AreaBean b : rMap.values()) {
				String areaId = b.getAreaId();

				loadHotMapCacheNow(areaId);
			}
		}

		// 地市
		if (null != cMap) {
			for (AreaBean b : cMap.values()) {
				String areaId = b.getAreaId();

				loadHotMapCacheNow(areaId);
			}
		}

		// 全省
		String areaId = InitParam.DEPLOY_PROVINCE_ID;

		loadHotMapCacheNow(areaId);

		// 设置缓存刷新时间
		String cacheTime = DateUtil.getInstance()
				.getToday("yyyy-MM-dd HH:mm:ss");
		HotMapCache.hotMapCache.put(HotMapCache.CACHE_NOW_TIME, cacheTime);
	}

	/**
	 * 
	 * @Description : 生成热力图数据--区域实时
	 * @return void
	 * 
	 * @author : wucm
	 * @date : 2015年7月22日 下午3:14:29
	 * 
	 */
	public void loadHotMapCacheNow(String areaId) {
		List<JSONObject> rList = null;

		// 查询数据
		rList = hotMapUtil.queryHotMap0Data(areaId);

		// 热力图数据处理
		JSONObject j = hotMapUtil.dealHotMapData0(rList);
		Map nowMap = (Map) HotMapCache.hotMapCache.get("now");
		nowMap.put(areaId, j);
	}

	/**
	 * 
	 * @Description : 生成热力图数据--区域24小时
	 * @return void
	 * 
	 * @author : wucm
	 * @date : 2015年7月22日 下午3:14:29
	 * 
	 */
	public void loadHotMapCache24(String areaId) {
		List<JSONObject> rList = null;

		// 查询数据
		rList = hotMapUtil.queryHotMap24Data(areaId);

		// 热力图数据处理
		JSONObject j = hotMapUtil.dealHotMapData24Or48(rList);
		Map h24Map = (Map) HotMapCache.hotMapCache.get("h24");
		h24Map.put(areaId, j);
	}

	/**
	 * 
	 * @Description : 生成热力图数据--区域48小时
	 * @return void
	 * 
	 * @author : wucm
	 * @date : 2015年7月22日 下午3:14:29
	 * 
	 */
	public void loadHotMapCache48(String areaId) {
		List<JSONObject> rList24 = null;
		List<JSONObject> rList48 = null;
		JSONObject compareDate = null;

		// 查询数据
		rList24 = hotMapUtil.queryHotMap24Data(areaId);
		rList48 = hotMapUtil.queryHotMap48Data(areaId);
		compareDate = hotMapUtil.queryCompareDate(areaId);

		// 热力图数据处理
		JSONObject j24 = hotMapUtil.dealHotMapData24Or48(rList24);
		JSONObject j48 = hotMapUtil.dealHotMapData24Or48(rList48);

		String today = compareDate.getString("today");
		String yesterday = compareDate.getString("yesterday");
		String lastday = compareDate.getString("lastday");

		JSONObject j = new JSONObject();
		j.put("map24", j24);
		j.put("map48", j48);
		j.put("today", today);
		j.put("yesterday", yesterday);
		j.put("lastday", lastday);

		Map h48Map = (Map) HotMapCache.hotMapCache.get("h48");
		h48Map.put(areaId, j);
	}
}
